home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 129_01 / 210roomb.c < prev    next >
Text File  |  1985-03-09  |  20KB  |  705 lines

  1. /************************************************************************/
  2. /*                roomb.c                 */
  3. /*        room code for Citadel bulletin board system        */
  4. /************************************************************************/
  5.  
  6. /************************************************************************/
  7. /*                History                 */
  8. /*                                    */
  9. /* 84Dec28 HAW    indexRooms modified to list deleted rooms.        */
  10. /* 84Dec20 JLS    renameRoom changed aides can decide to cause amnesia.    */
  11. /* 84Dec20 JLS & HAW "vp" union eliminated from the system.        */
  12. /* 84Jun28 JLS    Enhancement: Creator of a room is listed in Aide>.    */
  13. /* 84Jun23 HAW & JLS  Local unused variables are zapped.        */
  14. /* 84Jun10 JLS    Room cannot have a name of length 0.            */
  15. /* 84May07 JLS & HAW Fix bug in makeRoom to ensure correct g. # inc.ed. */
  16. /* 84Apr04 HAW    Start upgrade to BDS 1.50a.                */
  17. /* 83Feb26 CrT    bug in makeRoom when out of rooms fixed.        */
  18. /* 83Feb26 CrT    matchString made caseless, normalizeString()        */
  19. /* 83Feb26 CrT    "]" directory prompt, user name before prompts        */
  20. /* 82Dec06 CrT    2.00 release.                        */
  21. /* 82Nov02 CrT    Cleanup prior to V1.2 mods.                */
  22. /* 82Nov01 CrT    Proofread for CUG distribution.             */
  23. /* 82Mar27 dvm    conversion to v. 1.4 begun                */
  24. /* 82Mar25 dvm    conversion for TRS-80/Omikron test started        */
  25. /* 81Dec21 CrT    Log file...                        */
  26. /* 81Dec20 CrT    Messages...                        */
  27. /* 81Dec19 CrT    Rooms seem to be working...                */
  28. /* 81Dec12 CrT    Started.                        */
  29. /************************************************************************/
  30.  
  31. #include <210ctdl.h>
  32.  
  33. /************************************************************************/
  34. /*                Contents                */
  35. /*                                    */
  36. /*    editText()        handles the end-of-message-entry menu    */
  37. /*    findRoom()        find a free room            */
  38. /*    getNumber()        prompt user for a number, limited range */
  39. /*    getRoom()        load given room into RAM        */
  40. /*    getString()        read a string in from user        */
  41. /*    getText()        reads a message in from user        */
  42. /*    getYesNo()        prompts for a yes/no response        */
  43. /*    givePrompt()        gives usual "THISROOM>" prompt        */
  44. /*    indexRooms()        build RAM index to ctdlroom.sys     */
  45. /*    makeRoom()        make new room via user dialogue     */
  46. /*    matchString()        search for given string         */
  47. /*    noteRoom()        enter room into RAM index        */
  48. /*    putRoom()        store room to given disk slot        */
  49. /*    renameRoom()        sysop special to rename rooms        */
  50. /*    replaceString()     string-substitute for message entry    */
  51. /*    zapRoomFile()        erase & re-initialize ctdlroom.sys    */
  52. /************************************************************************/
  53.  
  54. /************************************************************************/
  55. /*    editText() handles the end-of-message-entry menu.        */
  56. /*    return TRUE  to save message to disk,                */
  57. /*           FALSE to abort message, and                */
  58. /*           ERROR if user decides to continue            */
  59. /************************************************************************/
  60. int editText(buf, lim)
  61. char *buf;
  62. int lim;
  63. {
  64.     char iChar(), toUpper()/*, buff[BUFSIZ]*/;
  65. /*
  66. int count;
  67.  
  68.     count = 25; */
  69.     do {
  70.     outFlag = OUTOK;
  71.     mPrintf("\n entry cmd: ");
  72.     switch (toUpper(iChar())) {
  73.     case 'A':
  74.         mPrintf("bort\n ");
  75.         if (getYesNo(" confirm")) return FALSE;
  76.         break;
  77.     case 'C':
  78.         mPrintf("ontinue\n ");
  79.         return ERROR;
  80.     case 'P':
  81.         mPrintf("rint formatted\n ");
  82.         doCR();
  83.         mPrintf(   "   ");
  84.         printDate();
  85.         if (loggedIn)   mPrintf(" from %s", msgBuf.mbauth);
  86.         doCR();
  87.         mFormat(buf);
  88.         break;
  89.     case 'R':
  90.         mPrintf("eplace string\n ");
  91.         replaceString(buf, lim);
  92.         break;
  93.     case 'S':
  94.         mPrintf("ave buffer\n ");
  95.         return TRUE;
  96.     default:
  97.         tutorial("edit.mnu");
  98. /*count--;*/
  99.         break;
  100.     }
  101.     } while ((haveCarrier  ||  onConsole)/* && count*/);
  102. /*if (count == 0) {
  103.     fcreat("blasted", buff);
  104.     fprintf(buff, "%s\nhC=%d, oC=%d, jLC=%d, Ooops=%d\nnC=%d, wIO=%d\032",
  105. logBuf.lbname,
  106.         haveCarrier, onConsole, justLostCarrier, Ooops, newCarrier,
  107.     whichIO);
  108.     fclose(buff);
  109.     onConsole = FALSE;
  110.     haveCarrier = interpret(pCarrDetect);
  111.     justLostCarrier = !haveCarrier;
  112. }*/
  113.     return FALSE;
  114. }
  115.  
  116. /************************************************************************/
  117. /*    findRoom() returns # of free room if possible, else ERROR    */
  118. /************************************************************************/
  119. int findRoom()
  120. {
  121.     int roomRover;
  122.  
  123.     for (roomRover=0;  roomRover<MAXROOMS;  roomRover++) {
  124.     if (!(roomTab[roomRover].rtflags & INUSE)) return roomRover;
  125.     }
  126.     return ERROR;
  127. }
  128.  
  129. /************************************************************************/
  130. /*    getNumber() prompts for a number in (bottom, top) range.    */
  131. /************************************************************************/
  132. int getNumber(prompt, bottom, top)
  133. char   *prompt;
  134. unsigned bottom;
  135. unsigned top;
  136. {
  137.     unsigned try;
  138.     char numstring[NAMESIZE];
  139.  
  140.     do {
  141.     outFlag = OUTOK;
  142.     getString(prompt, numstring, NAMESIZE);
  143.     try    = atoi(numstring);
  144.     if (try < bottom)  mPrintf("Sorry, must be at least %d\n", bottom);
  145.     if (try > top    )  mPrintf("Sorry, must be no more than %d\n", top);
  146.     } while ((try < bottom ||  try > top)
  147.       && (haveCarrier  ||  onConsole)
  148.     );
  149.     return  try;
  150. }
  151.  
  152. /************************************************************************/
  153. /*    getRoom()                            */
  154. /************************************************************************/
  155. getRoom(rm)
  156. int rm;
  157. {
  158.     int      read();
  159.     unsigned val;
  160.  
  161.     /* load room #rm into memory starting at buf */
  162.     thisRoom    = rm;
  163.     seek(roomfl, rm*SECSPERROOM, 0);
  164.     if ((val = read(roomfl, &roomBuf, SECSPERROOM)) >= 1000)   {
  165.     printf(" ?getRoom(): read failed, val=%d\n", val);
  166.     }
  167.     crypte(&roomBuf, (SECSPERROOM * SECTSIZE), rm);
  168. }
  169.  
  170. /************************************************************************/
  171. /*    getString() gets a string from the user.            */
  172. /************************************************************************/
  173. getString(prompt, buf, lim)
  174. char *prompt;
  175. char *buf;
  176. int  lim;    /* max # chars to read */
  177. {
  178.     char iChar();
  179.     char c;
  180.     int  i;
  181.  
  182.     outFlag = OUTOK;
  183.  
  184.     if(strLen(prompt) > 0) {
  185.     doCR();
  186.     mPrintf("Enter %s\n : ", prompt, lim);
  187.     }
  188.  
  189.     i    = 0;
  190.     while (
  191.      c = iChar(),
  192.  
  193.      c      != NEWLINE
  194.      && i      <  lim
  195.      && (haveCarrier || onConsole)
  196.     ) {
  197.     outFlag = OUTOK;
  198.  
  199.     /* handle delete chars: */
  200.     if (c == BACKSPACE) {
  201.         oChar(' ');
  202.         oChar(BACKSPACE);
  203.         if (i > 0) i--;
  204.         else  {
  205.         oChar(' ');
  206.         oChar(BELL);
  207.         }
  208.     } else     buf[i++] = c;
  209.  
  210.     if (i >= lim) {
  211.         oChar(BELL);
  212.         oChar(BACKSPACE); i--;
  213.     }
  214.  
  215.     /* kludge to return immediately on single '?': */
  216.     if (*buf == '?')   {
  217.         doCR();
  218.         break;
  219.     }
  220.     }
  221.     buf[i]  = '\0';
  222. }
  223.  
  224. /************************************************************************/
  225. /*    getText() reads a message from the user             */
  226. /*    Returns TRUE if user decides to save it, else FALSE        */
  227. /************************************************************************/
  228. char getText(prompt, buf, lim, recipient)
  229. char *prompt;
  230. char *buf;
  231. char *recipient;    /* Meaningful iff thisRoom == MAILROOM */
  232. int  lim;    /* max # chars to read */
  233. {
  234.     char iChar(), visible();
  235.     char c, sysopAbort;
  236.     int  i, toReturn;
  237.  
  238.     outFlag = OUTOK;
  239.     if (!expert)    tutorial("entry.blb");
  240.  
  241.     outFlag = OUTOK;
  242.     if (!expert)    mPrintf(   "Enter %s (end with empty line)", prompt);
  243.  
  244.     outFlag = OUTOK;
  245.     doCR();
  246.  
  247.     mPrintf(   "   ");
  248.     printDate();
  249.  
  250.     if (loggedIn)  mPrintf("from %s", msgBuf.mbauth);
  251.     if (thisRoom == MAILROOM) mPrintf(" to %s", recipient);
  252.     doCR();
  253.     lim--;
  254.     i  = 0;
  255.     toReturn    = TRUE;
  256.     sysopAbort    = FALSE;
  257.     do {
  258.     if (whichIO == MODEM)    {
  259.         fastIn(toReturn == ERROR);
  260.         if (whichIO != MODEM)   sysopAbort    = TRUE;
  261.     } else {
  262.        /* this code would handle the modem as well...    */
  263.        /* fastIn() is a later addition to handle people    */
  264.        /* who like to upload fast without handshaking    */
  265.        while (
  266.         !(  (c=iChar()) == NEWLINE   &&   buf[i-1] == NEWLINE )
  267.         && i < lim
  268.         && (haveCarrier ||